// 布尔类型
let bol: boolean = false

// 十进制
let float10: number = 20
// 十六进制
let float16: number = 0x14  // 4代表4，1代表1 * 16，16 + 4 = 20 
// 二进制
let float2: number = 0b10100  // 从右到左分别为：0、2、4、8、16，1的地方分别为4和16，加起来等于20
// 八进制
let float8: number = 0o24 // 4代表4，2代表2 * 8，16 + 4 = 20

// 字符串
let str: string = 'Lzc'

// 数组
// 这两种的意思都一样，代表数字类型的数组，比较推荐第一种
let arr: number[] = [1, 2, 3] 
let arr1: Array<number> = [1, 2, 3]

// 元组：不同元素类型的数组
let arr2: [string, number] // 必须按照该顺序类型赋值
arr2 = ['hello', 20]

// 枚举
enum Color {
  Red = 2,
  Green,
  Blue
}

let colorName: string = Color['3']  // Green
let colorNum: number = Color['Red'] // 2

// any：任意类型，一旦使用any，ts就不会进行校验
let anyStr: any = 10
anyStr = 'lzc'
let anyArr: any[] = [1, true, 'lzc']
anyArr[1] = 'lqm'

// void：当一个函数没有return时，就使用void
function voidFn (): void {
  console.log('is void fn')
}
let voidLet: void = undefined // 当void定义在变量时，值就只可以为undefined或null
let voidLet1: void = null

// undefined和null：null和undefined是所有类型的子类型，ts默认允许赋值子类型时，不报错
// 假如需要校验，可以使用命令 tsc index.js --strictNullChecks
let u: undefined = undefined
let n: null = null
let n1: null = undefined
let num: number = null

// never：用于函数，不能结束的或者报错的
function neverFn (err: string): never {
  throw new Error(err)
}

function neverFn1 (err: string): never {
  while (true) {

  }
}

// declare用于定义一个函数，| 为联合类型，这里指参数可以为object或null
declare function create (o: object | null): void
create({prop: 0})
create(null)

// 类型断言
let type: any = 'this is string' 
// 两种写法都是强行把any类型转化为string类型，比较推荐第二种
let typeLength: number = (<string>type).length
let typeLength1: number = (type as string).length
